package com.lianyanxian.countwords;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @author lianyanxian
 * 
 */
public class CountWords {

	private String dataPath; //数据文件的路径

	/**
	 * 设置数据文件的路径
	 * @param dataPath 数据文件的路径
	 */
	public void setDataPath(String dataPath) {
		this.dataPath = dataPath;
	}

	/**
	 * 取得最后的结果
	 * @return result
	 * @throws IOException
	 */
	public Map<String, Integer> getResult() throws IOException {
		return countToken(getToken(readData(dataPath)));
	}

	/**
	 * 读取数据
	 * @param path 要读取的文件路径
	 * @return data
	 * @throws IOException
	 */
	private String readData(String path) throws IOException {
		String data = "";
		String temp = null;

		FileReader reader = new FileReader(new File(path));
		BufferedReader br = new BufferedReader(reader);

		while ((temp = br.readLine()) != null) { //一行一行读取
			data += temp;
		}

		return data;
	}

	/**
	 * 处理数据，依照空格读取各个单词
	 * @param data 
	 * @return 返回 单词列表
	 */
	private ArrayList<String> getToken(String data) {
		List<String> tokenList = new ArrayList<String>();

		for (String token : data.split(" ")) { //按照空格取得每个单词，添加进ArrayList
			tokenList.add(token);
		}

		return (ArrayList<String>) tokenList; //返回单词列表
	}

	/**
	 * 计算各个单词数目
	 * @param tokenList
	 * @return result
	 */
	private Map<String, Integer> countToken(List<String> tokenList) {
		Map<String, Integer> result = new HashMap<String, Integer>();
		
		for (String token : tokenList) { //遍历List里面所有单词
			Integer tokenNum = result.get(token); //取得当前单词的数目
			result.put(token, tokenNum == null ? 1 : tokenNum + 1); //如果当前数目为空，则设置数目为1；如果不为空，则说明此单词已经存在，+1
		}
		
		return result;
	}

	public static void main(String[] args) throws IOException {
		CountWords cw = new CountWords();
		
		cw.setDataPath("readData.txt"); //设置数据文件的路径,此为默认路径，如"E:\\readData.txt"代表在E盘目录下读取readData.txt
		System.out.println(cw.getResult());
		JfreeChartUtil.creatChart(cw.getResult());
	}

}
